package com.atguigu.singleton.type4;

/**
 * @program: design-patterns
 * @author: yangshen
 * @description: type3 - 懒汉式2（线程安全，同步方法）
 * 优缺点说明：
 * 1) 解决了线程不安全问题
 * 2) 效率太低了，每个线程在想获得类的实例时候，执行getInstance()方法都要进行同步。而其实这个方法只执行一次实例化代码就够了，后面的想获得该类实例，直接return就行了。方法进行同步效率太低
 * 3) 结论：在实际开发中，不推荐使用这种方式
 * @create: 2022-01-16 11:28
 **/
public class SingleTon {

    public static void main(String[] args) {
        System.out.println("懒汉式2 - 线程安全，同步方法");
        //测试
        SingleTon instance1 = SingleTon.getInstance();
        SingleTon instance2 = SingleTon.getInstance();
        //true
        System.out.println(instance1 == instance2);
        System.out.println("instance1.hashCode() = "+ instance1.hashCode());
        System.out.println("instance2.hashCode() = "+ instance2.hashCode());
    }

    /**
     * 1.构造器私有化，外部不能new
     */
    private SingleTon() {
    }

    /**
     * 2.定义对象实例
     */
    private static SingleTon SINGLE_TON ;

    /**
     * 3.提供一个公有的静态方法，返回实例对象（懒汉式：在使用该对象且该对象不存在时才会创建）
     * @return 该对象实例
     */
    public static synchronized SingleTon getInstance(){
        if (null == SINGLE_TON){
            SINGLE_TON = new SingleTon();
        }
        return SINGLE_TON;
    }
}
